////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifepdpc11.h
/// @brief ifepdpc11 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFEPDPC11_H
#define CAMXIFEPDPC11_H

#include "camxformats.h"
#include "camxispiqmodule.h"
#include "iqcommondefs.h"
#include "pdpc_1_1_0.h"
#include "titan170_base.h"
#include "titan170_ife.h"


CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

/// @brief IFE PDPC Module Register Set
struct IFEPDPC11RegCmd
{
    IFE_IFE_0_VFE_PDAF_CFG            configRegister;           ///< Configuration Register. Offset: 0xcb4
    IFE_IFE_0_VFE_PDAF_HDR_EXP_RATIO  ratioHDRRegister;         ///< HDR Ratio Register. Offset: 0xcb8
    IFE_IFE_0_VFE_PDAF_BP_TH          setBPTHregister;          ///< Bad Pixtel Threshold Register. Offset: 0xcbc
    IFE_IFE_0_VFE_PDAF_T2_BP_OFFSET   offsetT2BPRegister;       ///< Bad Pixtel Threshold Offset Register. Offset: 0xcc0
    IFE_IFE_0_VFE_PDAF_BP_OFFSET      offsetBPRegister;         ///< Bad Pixel Threshold Offset for T2 Green Pixel. 0xcc4
    IFE_IFE_0_VFE_PDAF_RG_WB_GAIN     gainRGWBRegister;         ///< AWG Gain Register for Red/Green Channel. offset: 0xcc8
    IFE_IFE_0_VFE_PDAF_BG_WB_GAIN     gainBGWBRegister;         ///< AWG Gain Register for Blue/Green Channel. Offset: 0xccc
    IFE_IFE_0_VFE_PDAF_GR_WB_GAIN     gainGRWBRegister;         ///< AWG Gain Register for Green/Red Channel. Offset: 0xCD0
    IFE_IFE_0_VFE_PDAF_GB_WB_GAIN     gainGBWBRegister;         ///< AWG Gain Register for Green/Blue Channel. Offset: 0xCD4
    IFE_IFE_0_VFE_PDAF_LOC_OFFSET_CFG offsetLOCConfigRegister;  ///< PDAF Line Offset Register. Offset: 0xCD8
    IFE_IFE_0_VFE_PDAF_LOC_END_CFG    setLOCENDConfigRegister;  ///< PDAF Pixel end Location register. Offset: 0xCDC
} CAMX_PACKED;

CAMX_END_PACKED


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE GTM Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFEPDPC11 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFEPDPC11 Object
    ///
    /// @param  pCreateData Pointer to data for PDPC Module Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Initialize
    ///
    /// @brief  Initialize parameters
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Initialize();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Generate Settings for GTM Object
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetRegCmd
    ///
    /// @brief  Retrieve the buffer of the register value
    ///
    /// @return Pointer of the register buffer
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID* GetRegCmd();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDualIFEData
    ///
    /// @brief  Provides information on how dual IFE mode affects the IQ module
    ///
    /// @param  pDualIFEData Pointer to dual IFE data the module will fill in
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID GetDualIFEData(
        IQModuleDualIFEData* pDualIFEData)
    {
        CAMX_ASSERT(NULL != pDualIFEData);

        pDualIFEData->dualIFESensitive      = TRUE;
        pDualIFEData->dualIFEDMI32Sensitive = TRUE;
    }

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFEPDPC11
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFEPDPC11();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFEPDPC11
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFEPDPC11();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// AllocateCommonLibraryData
    ///
    /// @brief  Allocate memory required for common library
    ///
    /// @return CamxResult success if the write operation is success
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult AllocateCommonLibraryData();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// DeallocateCommonLibraryData
    ///
    /// @brief  Deallocate memory required for common library
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID DeallocateCommonLibraryData();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return TRUE if dependencies met
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Update IFE internal data
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Interpolation and Calculation
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// PrepareStripingParameters
    ///
    /// @brief  Prepare striping parameters for striping lib
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult PrepareStripingParameters(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ModuleInitialize
    ///
    /// @brief  Initialize the Module Data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID ModuleInitialize();

    IFEPDPC11(const IFEPDPC11&)            = delete;    ///< Disallow the copy constructor
    IFEPDPC11& operator=(const IFEPDPC11&) = delete;    ///< Disallow assignment operator

    PDPC11InputData                   m_dependenceData; ///< Dependence Data for this Module
    IFEPDPC11RegCmd                   m_regCmd;         ///< Register List of this Module
    BOOL                              m_isLUTLoaded;    ///< Determine if the Lut has been loaded
    pdpc_1_1_0::chromatix_pdpc11Type* m_pChromatix;     ///< Pointer to tuning mode data
};

CAMX_NAMESPACE_END

#endif // CAMXIFEPDPC11_H
